package Agentes;

import Objetos.*;
import jade.core.AID;
import jade.core.Agent; 
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;

public class Evaluador extends Agent{
	
	protected void setup() { 
		Indicadores.tick++;
		addBehaviour(new TickerBehaviour(this, 5000) {
			public void onTick() {
				addBehaviour(new Revisar());
			}
			});
		
	}
	public class ValorizarCentro extends OneShotBehaviour {   
		public void action() {  
			int p = -1 ,q = -1;
			for (int i = 0; i<200; i++){
				for (int j = 0; j<200; j++){
					if(Indicadores.suelos[i][j] == Indicadores.sueloC){
						p = i;
						q = j;
						break;					
					}
				}
				if(p != -1)
					break;
			}
			
			//Se establece un vecindario sobre el cual se va a Valorizar
			int inferiorX = p-4;
			int superiorX = p+4;
			int inferiorY = q-4;
			int superiorY = q+4;
			
			Indicadores.sueloC.claseAlta = Indicadores.sueloC.claseAlta * 1.2;
			Indicadores.sueloC.precio = Indicadores.sueloC.precio * 1.1;
			
			for(int i = inferiorX; i <= superiorX; i++)
			{
				for(int j = inferiorY; j <= superiorY; j++)
				{
					if(j>=0 && j<200 && i>=0 && i<200&& !(j==q && i==p))
					{
						
						Suelo vecino = null;
						
						if (!(Indicadores.suelos[i][j].tipo == 1))
							vecino = Indicadores.suelos[i][j];
							
						if(vecino == null)
						continue;
						
						if(i==inferiorX || i==superiorX || j==inferiorY || j==superiorY)//Si es vecino en el radio 4
						{
							vecino.claseAlta *= 1.16;
							vecino.precio *=  1.06;						
						}
						else if(i==(inferiorX-1) || i==(superiorX-1) || j==(inferiorY-1) || j==(superiorY-1))//Si es vecino en el radio 3
						{
							vecino.claseAlta *= 1.17;
							vecino.precio *=  1.07;				
						}
						else if(i==(inferiorX-2) || i==(superiorX-2) || j==(inferiorY-2) || j==(superiorY-2))//Si es vecino en el radio 2
						{
							vecino.claseAlta *= 1.18;
							vecino.precio *=  1.08;						
						}
						else //Si es vecino en el radio 1
						{
							vecino.claseAlta *= 1.19;
							vecino.precio *=  1.09;	
						}
						
					}
					
				} 
				
			}
			
		}
	}
	
	public class ValorizarResidencia extends OneShotBehaviour {   
		public void action() {  
			int p = -1 ,q = -1;
			for (int i = 0; i<200; i++){
				for (int j = 0; j<200; j++){
					if(Indicadores.suelos[i][j] == Indicadores.sueloR){
						p = i;
						q = j;
						break;					
					}
				}
				if(p != -1)
					break;
			}
			
			//Se establece un vecindario sobre el cual se va a Valorizar
			int inferiorX = p-4;
			int superiorX = p+4;
			int inferiorY = q-4;
			int superiorY = q+4;
			
			Indicadores.sueloC.claseAlta = Indicadores.sueloC.claseAlta * 1.2;
			Indicadores.sueloC.precio = Indicadores.sueloC.precio * 1.1;
			
			for(int i = inferiorX; i <= superiorX; i++)
			{
				for(int j = inferiorY; j <= superiorY; j++)
				{
					if(j>=0 && j<200 && i>=0 && i<200&& !(j==q && i==p))
					{
						
						Suelo vecino = null;
						
						if (!(Indicadores.suelos[i][j].tipo == 1))
							vecino = Indicadores.suelos[i][j];
							
						if(vecino == null)
							continue;
						
						if(i==inferiorX || i==superiorX || j==inferiorY || j==superiorY)//Si es vecino en el radio 4
						{
							vecino.claseAlta *= 1.16;
							vecino.precio *=  1.06;						
						}
						else if(i==(inferiorX-1) || i==(superiorX-1) || j==(inferiorY-1) || j==(superiorY-1))//Si es vecino en el radio 3
						{
							vecino.claseAlta *= 1.17;
							vecino.precio *=  1.07;				
						}
						else if(i==(inferiorX-2) || i==(superiorX-2) || j==(inferiorY-2) || j==(superiorY-2))//Si es vecino en el radio 2
						{
							vecino.claseAlta *= 1.18;
							vecino.precio *=  1.08;						
						}
						else //Si es vecino en el radio 1
						{
							vecino.claseAlta *= 1.19;
							vecino.precio *=  1.09;	
						}
						
					}
					
				} 
				
			}
			
		}
	}
	
	public class Distancias extends OneShotBehaviour {   
		public void action() {    

			double distancia;		
			int xSuelo, ySuelo, xCentro = -1, yCentro = -1;
			
			for (int i = 0; i<200; i++){
				for (int j = 0; j<200; j++){
					if(Indicadores.suelos[i][j].construccion == (Object)Indicadores.nuevoC){
						xCentro = i;
						yCentro = j;
						break;					
					}
				}
				if(xCentro != -1)
					break;
			}
			
			for (int i = 0; i<200; i++){
				for (int j = 0; j<200; j++){
			
					xSuelo = i;
					ySuelo = j;
					Indicadores.suelos[i][j].distancia *= (Indicadores.centros - 1);
					Indicadores.suelos[i][j].distancia += Math.sqrt(Math.pow(xSuelo-xCentro, 2) + Math.pow(ySuelo-yCentro,2));
					Indicadores.suelos[i][j].distancia /= Indicadores.centros;	
				}
			}
			
		}
	}
	
	public class DensidadC extends OneShotBehaviour {   
		public void action() {     
			
			int x = -1, y = -1;
			
			for (int i = 0; i<200; i++){
				for (int j = 0; j<200; j++){
					if(Indicadores.suelos[i][j] == Indicadores.sueloC){
						x = i;
						y = j;
						break;					
					}
				}
				if(x != -1)
					break;
			}
			
			int inferiorX = x-3;
			int superiorX = x+3;
			int inferiorY = y-3;
			int superiorY = y+3;
			
			
			for(int i = inferiorX; i <= superiorX; i++)
			{
				
				for(int j = inferiorY; j <= superiorY; j++)
				{
					if(j>=0 && j<200 && i>=0 && i<200)
						Indicadores.suelos[i][j].densidad++;					
				} 
			}
			

		}
	}
	
	public class DensidadR extends OneShotBehaviour {   
		public void action() {     
			
			int x = -1, y = -1;
			
			for (int i = 0; i<200; i++){
				for (int j = 0; j<200; j++){
					if(Indicadores.suelos[i][j] == Indicadores.sueloR){
						x = i;
						y = j;
						break;					
					}
				}
				if(x != -1)
					break;
			}
			
			int inferiorX = x-3;
			int superiorX = x+3;
			int inferiorY = y-3;
			int superiorY = y+3;
			
			
			for(int i = inferiorX; i <= superiorX; i++)
			{
				
				for(int j = inferiorY; j <= superiorY; j++)
				{
					if(j>=0 && j<200 && i>=0 && i<200)
						Indicadores.suelos[i][j].densidad++;					

				} 
			}
		}
	}
	
	public class CrecimientoPoblacional extends OneShotBehaviour {   
		public void action() {    
			double parametro = 0.2;
			double poblacion = parametro * Indicadores.poblacion.size();
			for(int i = 0 ; i<poblacion; i++)
				Indicadores.poblacion.add(new Persona());
		}
	}
	
	public class ActualizarAhorro extends OneShotBehaviour {   
		public void action() {     
			for(int i = 0 ; i<Indicadores.poblacion.size(); i++)
				Indicadores.ahorro += Indicadores.poblacion.get(i).ahorro;
		}
	}
	
	private class Revisar extends OneShotBehaviour
	{

		public void action() {
			ACLMessage msg = myAgent.receive();
			if (msg != null) {
				// Message received. Process it
				//int respu = Integer.parseInt(msg.getContent());
				//if(respu==20){
				if(msg.getSender().getName().substring(0,msg.getSender().getName().indexOf('@')).equals("CR1")){
					
					addBehaviour(new Licenciar());
					addBehaviour(new CrecimientoPoblacional());
					addBehaviour(new ActualizarAhorro());
					addBehaviour(new DensidadR());
					addBehaviour(new DensidadC());
					addBehaviour(new Distancias());
					addBehaviour(new ValorizarResidencia());
					addBehaviour(new ValorizarCentro());
				}
			}

		}
	}
	
	public class Licenciar extends OneShotBehaviour{
		 
		  public void action()
			{   
				if(Indicadores.tick % 2 == 0){
					for (int i = 0; i<200; i++){
						for (int j = 0; j<200; j++){
							System.out.print(Indicadores.suelos[i][j].tipo + "    ");
						}
						System.out.println("");
					}
				}
				
				ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
				msg.addReceiver(new AID("G1", AID.ISLOCALNAME));
				msg.setContent("100");
				send(msg);
				//Formar el mensaje y mandarcelo al EMpleador
			}

	 
	}
}
